Pytorch实现的LSTM模型结构 |
您所在的位置:网站首页 › lstm pytorch 预测生成 › Pytorch实现的LSTM模型结构 |
LSTM模型结构
1、LSTM模型结构2、LSTM网络3、LSTM的输入结构4、Pytorch中的LSTM4.1、pytorch中定义的LSTM模型4.2、喂给LSTM的数据格式4.3、LSTM的output格式4.4 LSTM笔记
5、LSTM和其他网络组合
1、LSTM模型结构
BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。如下图是一个普通的BP网络和CNN网络。 当我们在网络上搜索看LSTM结构的时候,看最多的是下面这张图: 中间的A节点隐含层,左边是表示只有一层隐含层的LSTM网络,所谓LSTM循环神经网络就是在时间轴上的循环利用,在时间轴上展开后得到右图。 看左图,很多同学以为LSTM是单输入、单输出,只有一个隐含神经元的网络结构,看右图,以为LSTM是多输入、多输出,有多个隐含神经元的网络结构,A的数量就是隐含层节点数量。 WTH?思维转不过来啊。这就是传统网络和空间结构的思维。 实际上,右图中,我们看Xt表示序列,下标t是时间轴,所以,A的数量表示的是时间轴的长度,是同一个神经元在不同时刻的状态(Ht),不是隐含层神经元个数。 我们知道,LSTM网络在训练时会使用上一时刻的信息,加上本次时刻的输入信息来共同训练。 举个简单的例子:在第一天我生病了(初始状态H0),然后吃药(利用输入信息X1训练网络),第二天好转但是没有完全好(H1),再吃药(X2),病情得到好转(H2),如此循环往复直到病情好转。因此,输入Xt是吃药,时间轴T是吃多天的药,隐含层状态是病情状况。因此我还是我,只是不同状态的我。 实际上,LSTM的网络是这样的: 为了更好理解LSTM结构,还必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示: pytorch中定义的LSTM模型的参数如下: class torch.nn.LSTM(*args, **kwargs) 参数有: input_size:x的特征维度 hidden_size:隐藏层的特征维度 num_layers:lstm隐层的层数,默认为1 bias:False则bihbih=0和bhhbhh=0. 默认为True batch_first:True则输入输出的数据格式为 (batch, seq, feature) dropout:除最后一层,每一层的输出都进行dropout,默认为: 0 bidirectional:True则为双向lstm默认为False结合前面的图形,我们一个个看。 (1)input_size:x的特征维度,就是数据立方体中的F,在NLP中就是一个词被embedding后的向量长度,如下图所示: (4)batch_first:用于定义输入输出维度,后面再讲。 (5)bidirectional:是否是双向循环神经网络,如下图是一个双向循环神经网络,因此在使用双向LSTM的时候我需要特别注意,正向传播的时候有(Ht, Ct),反向传播也有(Ht’, Ct’),前面我们说了非双向LSTM的输出维度等于隐藏层的特征维度,而双向LSTM的输出维度是隐含层特征数2,而且H,C的维度是时间轴长度2。 pytorch中LSTM的输入数据格式默认如下: input(seq_len, batch, input_size) 参数有: seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度 batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子 input_size:特征维度,和前面定义网络结构的input_size一致。前面也说到,如果LSTM的参数 batch_first=True,则要求输入的格式是: input(batch, seq_len, input_size)刚好调换前面两个参数的位置。其实这是比较好理解的数据形式,下面以NLP中的embedding向量说明如何构造LSTM的输入。 之前我们的embedding矩阵如下图: 注意,如果我们定义的input格式是: input(batch, seq_len, input_size)则H和C的格式也是要变的: h0(batch, num_layers * num_directions, hidden_size) c0(batch, num_layers * num_directions, hidden_size) 4.3、LSTM的output格式LSTM的输出是一个tuple,如下: output,(ht, ct) = net(input) output: 最后一个状态的隐藏层的神经元输出 ht:最后一个状态的隐含层的状态值 ct:最后一个状态的隐含层的遗忘门值output的默认维度是: output(seq_len, batch, hidden_size * num_directions) ht(num_layers * num_directions, batch, hidden_size) ct(num_layers * num_directions, batch, hidden_size)和input的情况类似,如果我们前面定义的input格式是: input(batch, seq_len, input_size)则ht和ct的格式也是要变的: ht(batc,num_layers * num_directions, h, hidden_size) ct(batc,num_layers * num_directions, h, hidden_size)说了这么多,我们回过头来看看ht和ct在哪里,请看下图:
还记得吗,output的维度等于隐藏层神经元的个数,即hidden_size,在一些时间序列的预测中,会在output后,接上一个全连接层,全连接层的输入维度等于LSTM的hidden_size,之后的网络处理就和BP网络相同了,如下图: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |